/**
 * 模型
 * 子弹
 */
import AbstractModel from "./abstract/AbstractModel";
import {image} from "../service/image";
import config from "../config";
import bullet from "../canvas/Bullet";
import {EnumDirection} from "../enum/enumPosition";
import utils from "../utils";
import wallBrick from "../canvas/WallBrick";
import wallSteel from "../canvas/WallSteel";
import boss from "../canvas/Boss";
import tank from "../canvas/Tank";
import player from "../canvas/Player";

export default class ModelStraw extends AbstractModel implements IModel {
    name: string = 'bullet';
    // 画布实例
    canvas: ICanvas = bullet;

    //tank: 属性：每一个子弹都有属于自己的坦克
    constructor(public tank: IModel) {
        // 子弹是坦克发的，所以子弹的坐标取的是坦克的x、y坐标为基准的，在坦克中间生成
        super(
            tank.x + Math.floor(config.model.common.width / 2),
            tank.y + Math.floor(config.model.common.height / 2))
        //子弹的方向就是坦克当下的方向
        this.direction = tank.direction as EnumDirection
    }

    // 继承父类抽象方法:渲染贴图

    // 一些初始化自定义的动作、行为，都在这里进行
    render(): void {
        // super.draw()
        // ********************* 坐标更新 *********************
        let x = this.x;
        let y = this.y;
        // 子弹速度
        let speed = this.tank.name === 'player' ? 4 : 2
        switch (this.direction) {
            case EnumDirection.top:
                y -= speed
                break;
            case EnumDirection.right:
                x += speed
                break;
            case EnumDirection.bottom:
                y += speed
                break;
            case EnumDirection.left:
                x -= speed
                break;
        }

        // // ********************* 坐标更新 *********************
        // 打不掉的障碍
        let touchNotBlowModel = utils.modelTouch(x, y, [
                ...wallSteel.models,// 钢墙
            ],
            config.model.bullet.width,
            config.model.bullet.height
        )

        // 打掉的障碍
        let touchBlowModel = utils.modelTouch(x, y, [
                ...wallBrick.models,// 砖墙
                ...boss.models,// boss
            ],
            config.model.bullet.width,
            config.model.bullet.height
        )
        // 如果是我方坦克的子弹，需要判断是否打中地方坦克
        let touchTankModel = undefined
        let touchPlayerModel = undefined
        if (this.tank.name === 'player') {
            touchTankModel = utils.modelTouch(x, y, [
                    ...tank.models,// 敌方坦克
                ],
                config.model.bullet.width,
                config.model.bullet.height
            )
        } else {
            touchPlayerModel = utils.modelTouch(x, y, [
                    ...player.models,// 我方坦克
                ],
                config.model.bullet.width,
                config.model.bullet.height
            )
        }

        //
        if (touchNotBlowModel || utils.isCanvasTouch(x, y, config.model.bullet.width, config.model.bullet.height)) {
            // 移除模型
            this.destroy()
            // 展示爆炸效果
            touchNotBlowModel && super.blast(touchNotBlowModel)
        } else if (touchPlayerModel || touchTankModel || touchBlowModel) {
            // 当前子弹模型消失
            this.destroy()

            // **************** 可打爆的障碍 ****************
            // 展示爆炸效果
            touchBlowModel && super.blast(touchBlowModel)
            // 碰撞的模型消失
            touchBlowModel && touchBlowModel.destroy();
            // **************** 可打爆的障碍 ****************

            // **************** 玩家坦克打爆敌方坦克 ****************
            // 展示爆炸效果
            touchTankModel && super.blast(touchTankModel)
            // 碰撞的模型消失
            touchTankModel && touchTankModel.destroy();
            // **************** 玩家坦克打爆敌方坦克 ****************

            // **************** 敌方坦克打爆玩家坦克 ****************
            // 展示爆炸效果
            touchPlayerModel && super.blast(touchPlayerModel)
            // 碰撞的模型消失
            touchPlayerModel && touchPlayerModel.destroy();
            // **************** 敌方坦克打爆玩家坦克 ****************

        } else {
            this.x = x;
            this.y = y;
            // 画布重绘, 渲染坦克模型，在这里调用减少重绘次数
            this.draw()
        }
    }

    // 函数:渲染模型
    draw(): void {
        this.canvas.ctx.drawImage(
            this.getImage(),
            this.x,
            this.y,
            config.model.bullet.width,
            config.model.bullet.height
        )
    }

    // 获取贴图
    getImage(): HTMLImageElement {
        return image.get(this.name as keyof typeof config.images)!;
    }
}
